import {ICommand} from "../core/ICommand";
import {VCairnEvent} from "../vcc/VCairnEvent";
import type {AxiosResponse} from "axios";

// noSend - 可能网络问题，请求没有发送出去
// noResponse - 服务器没响应，请求已经出去了
// serverError - 服务器返回了，但响应码超出了2xx
// serverSuccess - 服务器返回了，成功响应2xx
// onSuccess - 服务器返回了，成功响应2xx，且没有业务上的错误
// onFail - 服务器返回了2xx，但返回的业务数据有问题，比如登录时用户密码错误，用户名错误等场景。
// 具体场景需要前后端自定义相关业务code

export class BaseCommand implements ICommand {

    execute(event: VCairnEvent): void {
    }

    serverSuccess(response: AxiosResponse) {
        if (!this.errorInSuccess(response)) {
            this.onSuccess(response);
        } else {
            this.onFail(response);
        }
    }

    protected onSuccess(response: AxiosResponse) {
        console.log('onSuccess', response);
    }
    protected onFail(response: AxiosResponse) {
        console.log('onFail', response);
    }

    // 业务场景中用于处理判断success中的error情况
    protected errorInSuccess(response: AxiosResponse) { return false; }

    onFinally() {}

    // 请求没有发送出去
    noSend(error: any) {
        // 发送请求时出了点问题，请求没发出
        console.log('Error', error.message);
    }
    // 服务端响应失败，超过2xx
    serverError(error: any) {
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        console.log('Error', error.message);
        // console.log(error.response.data);
        // console.log(error.response.status);
        // console.log(error.response.headers);
    }
    // 请求发出但服务端未响应
    noResponse(error: any) {
        console.log('Error', error.message);
        // 请求已经成功发起，但没有收到响应
        // `error.request` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        // console.log(error.request);
    }

}

export type BaseCommandConstructor =
    new () => BaseCommand;